/**
 * @brief 使用NXP提供的I.MX6ULL官方IAR SDK包开发
 *        要移植的文件有:
 *          fsl_common.h
 *          fsl_iomuxc.h
 *          MCIMX6Y2.h
 *          自定义的文件 cc.h
 */
#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "MCIMX6Y2.h"

/**
 *  @brief  :使能I.MX6U所有外设时钟
 *  @param  :无
 *  @retval :无
 */
void clk_enable(void)
{
    CCM->CCGR0= 0xFFFFFFFF;
    CCM->CCGR1= 0xFFFFFFFF;
    CCM->CCGR2= 0xFFFFFFFF;
    CCM->CCGR3= 0xFFFFFFFF;
    CCM->CCGR4= 0xFFFFFFFF;
    CCM->CCGR5= 0xFFFFFFFF;
    CCM->CCGR6= 0xFFFFFFFF;
}

/**
 *  @brief  :初始化LED对应的GPIO
 *  @param  :无
 *  @retval :无
 */
void led_init(void)
{
    // #define IOMUXC_GPIO1_IO03_GPIO1_IO03                         0x020E0068U, 0x5U, 0x00000000U, 0x0U, 0x020E02F4U
    /*1.初始化IO复用*/
    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO03_GPIO1_IO03,0);        //这个具体是如何实现的还不知道

    /**2.  配置GPIO1_IO03的IO属性
     *   bit 16:  0 HYS 关闭   其实就是是否使能施密特触发器
     *   bit [15:14]:00  默认下拉
     *   bit [13] : 0 kepper功能          为0时使用状态保持器  为1时使用上下拉
     *   bit [12] : 1 pull/keeper使能     为0时禁止上下拉/状态保持  为1时使能上下拉和状态保持器
     *   bit [11] : 0 关闭开路输出
     *   bit [7:6] :10  速度100Mhz
     *   bit [5:3] :110 R0/6驱动能力
     *   bit [0]   : 0 低压摆率
     */
    IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO03_GPIO1_IO03,0x10B0);

    /*3.初始化GPIO,设置GPIO1_IO03设置为输出*/
    GPIO1->GDIR |= (1<<3);

    /*4.设置GPIO1_IO03输出低电平,打开LED0*/
    GPIO1->DR &= ~(1<<3);
}

/**
 *  @brief  :打开LED灯
 *  @param  :无
 *  @retval :无
 */
void led_on(void)
{
    /*将GPIO1_DR的bit3清零*/
    GPIO1->DR &= ~(1<<3);
}

/**
 *  @brief  :关闭LED灯
 *  @param  :无
 *  @retval :无
 */
void led_off(void)
{
    /*将GPIO1_DR的bit3清零*/
    GPIO1->DR |= (1<<3);
}

/**
 *  @brief :短时间延时函数
 *  @param :n 要延时循环次数(空操作循环次数,模式延时)
 *  @param :无 
 */
void delay_short(volatile unsigned int n)
{
    while (n--)
    {
        ;
    }
}

/**
 *  @brief :延时函数,要在396MHz的主频下延时时间大约为1ms
 *  @param :n 要延时的ms数
 *  @retval:无 
 */
void delay(volatile unsigned int n)
{
    while (n--)
    {
        delay_short(0X7FF);
    }
}

/**
 *  @brief :main函数
 *  @param :无
 *  @retval:无 
 */
int main(void)
{
    clk_enable();    //使能所有时钟
    led_init();      //初始化led

    while (1)        //死循环
    {
        led_off();   //关闭LED
        delay(500);  //延时约500ms

        led_on();    //打开LED
        delay(500);  //延时大约500ms
    }

    return 0;
}

